package org.blogwu.smart.s055;

/**
 * 伪共享解决方案：
 *
 * @author xiaohu
 * @date 2021/11/23
 **/
public class FalseShared {
    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
//            Count count = new Count();  // 未使用缓存行填充优化   1281~1290
//            Count1 count = new Count1(); // 使用缓存行填充优化   471~479
        Count2 count = new Count2();  // 未使用缓存行填充优化   1281~1290

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100000000; i++) {
                count.a++;
            }
        });
        Thread t2 = new Thread(() -> {

            for (int i = 0; i < 100000000; i++) {
                count.b++;
            }
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("time is: " + (System.currentTimeMillis() - start));
    }
}

class Count {
    volatile long a;
    volatile long b;
}

/**
 * 手动填充缓存行
 * 默认缓存行为64字节, long为8个字节，  一个缓存行为8个long
 */
class Count1 {
    volatile long a;
    long p1, p2, p3, p4, p5, p6, p7;
    volatile long b;
}

/**
 * 使用JDK注解  需要添加JVM参数-XX:-RestrictContended
 * 下载JOL插件
 */
class Count2 {
    volatile long a;

    @sun.misc.Contended
    volatile long b;
}

class Na {
    volatile long a;
}

class NaPadding extends Na {
    int p1, p2, p3, p4, p5, p6, p7;
}

/**
 * 这样做事防止JVM优化，变成内存中a、b排列在一起，p1~p7排列在一起。
 */
class MyNa extends NaPadding {
    volatile long b;
}